缓冲分析 Sample详情

最后更新时间:2019年6月17日

邻近度(Proximity)描述了地理空间中两个地物距离相近的程度,其确定是空间分析的一个重要手段。如公共设施(商场,邮局,银行,医院,车站,学校等)的服务半径,大型水库建设引起的搬迁,铁路,公路以及航运河道对其所穿过区域经济发展的重要性等,均是一个邻近度问题。缓冲区分析是解决邻近度问题的空间分析工具之一 。

所谓缓冲区就是在点、线、区实体周围建立一定宽度范围的多边形。换言之,任何目标所产生的缓冲区总是一些多边形,这些多边形将构成新的数据层。点的缓冲区,以点的中心坐标为圆心,做半径为缓冲半径的圆;线的缓冲区,根据左右半径的设置形成缓冲区;区的缓冲区,将原始区图元边界向外或向内偏移缓冲半径大小后的区。点、线、区的缓冲分析采用同一套接口,实现方法类似。

1 点缓冲分析

1

获取分析对象

查看缓冲分析的buffer方法,接口参数中分析的对象是Geometry(几何对象基类),所以首先需获取待分析的对象。主要有以下三种方式获取Geometry对象:

FeaturePagedResult result = featureQuery.query();          //要素查询
Feature feature = result.getPage(1).get(i);                //获取查询结果要素
Geometry geometry=feature.getGeometry();                   //获取要素几何信息
Dot dot = new Dot(12734303.968851445,3570919.2046056115);  //坐标点(地图坐标)
GraphicPoint graphicPoint = new GraphicPoint();            //创建点图形对象
graphicPoint.setPoint(dot);                                //点图形对象设置坐标点
graphicPoint.setColor(addColor);                           //设置点图形填充颜色
graphicPoint.setSize(10);	                           //设置点图形大小
//将点图形转为点几何要素
Geometry geometry = Graphic.toGeometry(graphicPoint);
Dot dot = new Dot(12734303.968851445,3570919.2046056115);  //创建坐标点(地图坐标)
GeoPoint geoPoint=new GeoPoint (dot);                      //创建几何对象

2

构造空间分析对象并缓冲分析

//实例化空间分析对象
SpaAnalysis spaAnalysis = new SpaAnalysis();
//执行缓冲分析功能(待分析几何对象、左半径、右半径、缓冲区边界类型、数据的源投影坐标系)
GeoPolygons geoPolygons= spaAnalysis.buffer(geometry,1000,0, (short) 0,null);

SDK提供给了两个缓冲分析的接口,可根据需要选择。

接口 说明
buffer(Geometry geom, double leftDis, double rightDis, short endCapStyle, SRefData sRefSrc)
参数:几何对象、左半径、右半径、缓冲区边界类型0/1/2-圆角/垂直/平角、数据的源投影坐标系
计算左右缓冲区
buffer(Geometry geom, double leftDis, double rightDis, SRefData sRefSrc)
参数:几何对象、左半径、右半径、数据的源投影坐标系
计算左右缓冲区(圆角边界)

重要说明:

(1)接口中可以设置左半径、右半径,针对不同类型的几何对象具有不同的作用。 【1】对于点缓冲分析,没有左半径、右半径之说,接口规定分析的半径以左半径参数为准,所以只需要设置左半径即可。 【2】对于线缓冲,可以根据线的节点先后顺序确定线要素的方向,从而根据线的方向确定左右半径。 【3】对于区缓冲,同样没有左右半径之说,只是对区进行外部缓冲分析,接口规定点缓冲分析的半径以左半径参数为准,所以只需要设置左半径即可。

(2)第一个方法中通过第4个参数可以设置缓冲区边界类型为圆角、垂直、平角三种类型,得到的效果不一样。对于点缓冲区分析,只支持圆角和平角边界,区缓冲只只支持圆角边界;线缓冲三种边界类型都支持。

(3)【1】当geometry几何的空间参考系单位与左右缓冲半径数值的单位一致时,最后一个参数sRefSrc赋值null即可;【2】当geometry的空间参考系单位和左右缓冲半径数值的单位不一致时,必须传入空间参考系对象sRefSrc。如缓冲半径是米,geom几何单位不是米,必须为sRefSrc参数传入geometry几何对象的空间参考系作为源空间参考系,并且缓冲分析得到结果的单位与传递的空间参考系的单位一致。

3

分析结果处理

缓冲分析得到的结果为GeoPolygons多区几何对象,根据应用需求,可以将其保存到地理要素中,也可以进行绘制显示,例如:

//将几何对象Geometry转换为几何图形Graphic
List<Graphic> graphics = Graphic.toGraphicsFromGeometry(geoPolygons);

//一:可以直接按照默认样式快速绘制
mapView.getGraphicsOverlay().addGraphics(graphics);

//二:可以为图形设置自定义颜色再进行绘制
for (int i = 0; i < graphics.size(); i++){
    //设置缓冲分析结果图形填充颜色
    graphics.get(i).setColor(Color.argb(50, 255, 0, 255)); 
    //显示缓冲分析结果图形
    mapView.getGraphicsOverlay().addGraphic(graphics.get(i));
}
mapView.refresh();  //刷新地图

点缓冲分析的展示效果如下图所示:

点缓冲1.jpg 点缓冲2.jpg


2 线缓冲分析

线缓冲分析的实现方法与点缓冲分析类似,区别只在于传递的待分析的几何对象类型不一致。

//构建坐标点
Dot dot1 = new Dot(12719530, 3603327);
Dot dot2 = new Dot(12736224, 3620660);
Dot[] dots = {dot2,dot1};	       
   
//创建线图形对象并绘制
GraphicPolylin graphicPolylin = new GraphicPolylin();
graphicPolylin.appendPoints(dots);   		   
//设置线图形样式(填充颜色、线宽)
graphicPolylin.setColor(addColor);
graphicPolylin.setLineWidth(5);
//将线图形添加到自定义图层GraphicLayer中
mapView.getGraphicsOverlay().addGraphic(graphicPolylin);

//将线图形转为线几何要素以待分析
Geometry geometry = Graphic.toGeometry(graphicPolylin);

分析的效果如下图所示:

线缓冲.jpg 线缓冲.jpg 线缓冲.jpg


3 区缓冲分析

与点缓冲分析方法类似。

// 根据屏幕的高宽自定义坐标点
DisplayMetrics dm = getResources().getDisplayMetrics();
int width = dm.widthPixels;
int height = dm.heightPixels;
PointF point1 = new PointF(width * 1 / 10, height * 1 / 10);
PointF point2 = new PointF(width * 4 / 10, height * 1f / 10);
PointF point3 = new PointF(width * 5.5f / 10, height * 2.8f / 10);
PointF point4 = new PointF(width * 3.5f / 10, height * 4.5f / 10);
PointF point5 = new PointF(width * 2.0f / 10, height * 4.5f / 10);
//创建多边形图形对象并进行绘制
GraphicPolygon graphicPolygon = new GraphicPolygon();
Dot dot1 = mapView.viewPointToMapPoint(point1);
Dot dot2 = mapView.viewPointToMapPoint(point2);
Dot dot3 = mapView.viewPointToMapPoint(point3);
Dot dot4 = mapView.viewPointToMapPoint(point4);
Dot dot5 = mapView.viewPointToMapPoint(point5);
ArrayList<Dot> dots = new ArrayList<Dot>();
dots.add(dot1);
dots.add(dot2);
dots.add(dot3);
dots.add(dot4);
dots.add(dot5);
dots.add(dot1);
graphicPolygon.setPoints(dots);
graphicPolygon.setColor(Color.argb(50, 0, 0, 255));
//图形绘制
mapView.getGraphicsOverlay().addGraphic(graphicPolygon);

//把自定义多边形图形转化为几何对象
Geometry geometry = Graphic.toGeometry(graphicPolygon);

区缓冲分析的结果如下图所示:

区缓冲.jpg